﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using br.com.SistemaChamados.Enum;
using br.com.SistemaChamados.Model;
using br.com.SistemaChamados.DAO;
using System.Data;

namespace br.com.SistemaChamados.Controller
{
    public class CallController
    {
        /// <summary>
        /// Método para atualizar um chamado
        /// </summary>
        /// <param name="call">Chamado com as informações atualizadas</param>
        /// <returns>EnumCRUDState</returns>
        public EnumCRUDState UpdateCall(Call call)
        {
            EnumCRUDState resultCall = EnumCRUDState.SQL_NOTHING;
            try
            {
                resultCall = CallDAO.UpdateCall(call);
            }
            catch (Exception ex)
            {
                resultCall = EnumCRUDState.SQL_ERROR;
                throw ex;
            }
            return resultCall;
        }

        /// <summary>
        /// Método que retorna da base de dados um chamado pelo seu Id
        /// </summary>
        /// <param name="call">Chamado com o Id que se deseja obter</param>
        /// <returns>Call</returns>
        public Call GetCall(Call call)
        {
            Call resultCall = null;
            try
            {
                resultCall = CallDAO.GetCall(call);
                if (resultCall != null)
                {
                    return resultCall;
                }
                else
                {
                    return null;
                }
            }
            catch (Exception ex)
            {
                return null;
                throw ex;
            }
        }

        /// <summary>
        /// Método para incluir um novo chamado
        /// </summary>
        /// <param name="call">O chamado a ser incluído</param>
        /// <returns>EnumGenericState</returns>
        public EnumGenericState InsertCall(Call call)
        {
            EnumGenericState resultCall = EnumGenericState.GENERIC_STATE_UNKNOW;
            try
            {
                resultCall = CallDAO.InsertCall(call);
            }
            catch (Exception ex)
            {
                resultCall = EnumGenericState.GENERIC_STATE_FAILED;
                throw ex;
            }
            return resultCall;
        }

        /// <summary>
        /// Método para pegar o Id do próximo chamado
        /// </summary>
        /// <returns>int?</returns>
        public int? GetCallId()
        {
            int? resultCall = null;
            try
            {
                resultCall = CallDAO.GetCallId();
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return resultCall;
        }

        /// <summary>
        /// Método para pegar um chamado pelo usuário de abertura e outros parâmetros
        /// </summary>
        /// <param name="userOpenId">Id do usuário de abertura</param>
        /// <param name="callId">Id do chamado</param>
        /// <param name="dateOpening">Data de abertura</param>
        /// <param name="problemDescription">Descrição do problema</param>
        /// <param name="categoryId">Id da categoria do chamado</param>
        /// <param name="subCategoryId">Id da subcategoria do chamado</param>
        /// <param name="statusId">Id do status do chaamdo</param>
        /// <returns></returns>
        public List<Call> GetCallByUser(int userOpenId, int? callId, string dateOpening, string problemDescription, int? categoryId, int? subCategoryId, int? statusId)
        {
            List<Call> listCall = null;
            try
            {
                listCall = CallDAO.GetCallsByUserOpenAndFilters(userOpenId, callId, dateOpening, problemDescription, categoryId, subCategoryId, statusId);
                if (listCall != null)
                {
                    return listCall;
                }
                else
                {
                    return null;
                }
            }
            catch (Exception ex)
            {
                return null;
                throw ex;
            }
        }

        /// <summary>
        /// Método que retorna uma lista de chamados que atendam a uma série de filtros
        /// </summary>
        /// <param name="userOpenId">Id do usuário de abertura</param>
        /// <param name="callId">Id do chamado</param>
        /// <param name="dateOpening">Data de abertura</param>
        /// <param name="problemDescription">Descrição do problema</param>
        /// <param name="categoryId">Id da categoria</param>
        /// <param name="subCategoryId">Id da subcategoria</param>
        /// <param name="statusId">Id do status do chamado</param>
        /// <returns>List - Call</returns>
        public List<Call> GetCallsWithFilters(int userOpenId, int? callId, string dateOpening, string problemDescription, int? categoryId, int? subCategoryId, int? statusId)
        {
            List<Call> listCall = null;            
            try
            {
                listCall = CallDAO.getOpenCallsWithFilters(userOpenId, callId, dateOpening, problemDescription, categoryId, subCategoryId, statusId);
                if (listCall != null)
                {
                    return listCall;
                }
                else
                {
                    return null;
                }
            }
            catch (Exception ex)
            {
                return null;
                throw ex;
            }
        }

        /// <summary>
        /// Método que retorna uma lista de chamados pelo técnico de atendimento e outros filtros
        /// </summary>
        /// <param name="userCloseId">Id do usuário de atendimento</param>
        /// <param name="callId">Id do chamado</param>
        /// <param name="dateOpening">Data de abertura</param>
        /// <param name="problemDescription">Descrição do problema</param>
        /// <param name="categoryId">Id da categoria</param>
        /// <param name="subCategoryId">Id da subcategoria</param>
        /// <param name="statusId">Id do status do chamado</param>
        /// <returns>List - Call</returns>
        public List<Call> GetCallByTechnician(int userCloseId, int? callId, string dateOpening, string problemDescription, int? categoryId, int? subCategoryId, int? statusId)
        {
            List<Call> listCall = null;
            try
            {
                listCall = CallDAO.GetCallsByTechnician(userCloseId, callId, dateOpening, problemDescription, categoryId, subCategoryId, statusId);
                if (listCall != null)
                {
                    return listCall;
                }
                else
                {
                    return null;
                }
            }
            catch (Exception ex)
            {
                return null;
                throw ex;
            }
        }

        /// <summary>
        /// Método que retorna todos os chamados abertos
        /// </summary>
        /// <returns>List - Call</returns>
        public List<Call> GetOpenCalls()
        {
            List<Call> Returnedlist = new List<Call>();
            try
            {
                Returnedlist = CallDAO.getOpenCalls();
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return Returnedlist;
        }

        public CallController()
        {

        }
    }
}